์ž‘์„ฑ: 2026-03-04 04:03:38์ˆ˜์ •: 2026-03-04 04:03:38

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ์„ค๊ณ„ ๋ฐ ๊ด€๊ณ„ ์ดํ•ดํ•˜๊ธฐ (PK, FK, Unique)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„์˜ ์‹œ์ž‘์€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ๊ทธ๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ณณ์„ ๋„˜์–ด, ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์ง€ํ‚ค๊ณ  ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ฐœ๋…๋“ค์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1. ํ…Œ์ด๋ธ” ์ œ์•ฝ ์กฐ๊ฑด (Constraints)

๋ฐ์ดํ„ฐ๊ฐ€ ์ •ํ™•ํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€๋˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ทœ์น™๋“ค์ž…๋‹ˆ๋‹ค.

โ‘  Primary Key (PK, ๊ธฐ๋ณธํ‚ค)

  • ์—ญํ• : ๊ฐ ํ–‰(Row)์„ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ ๋ถ„์ฆ ๋ฒˆํ˜ธ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ํŠน์ง•: ์ค‘๋ณต๋  ์ˆ˜ ์—†์œผ๋ฉฐ, NULL ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”๋‹น ํ•˜๋‚˜๋งŒ ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โ‘ก Foreign Key (FK, ์™ธ๋ž˜ํ‚ค)

  • ์—ญํ• : ํ•œ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ PK๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง•: ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๋ฉฐ, ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์— ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹ ํ…Œ์ด๋ธ”์— ๋„ฃ์„ ์ˆ˜ ์—†๊ฒŒ ๋ง‰์•„ '๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ'์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

โ‘ข Unique Key (๊ณ ์œ ํ‚ค)

  • ์—ญํ• : ์ค‘๋ณต๋œ ๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ฐจ์ด์ : PK์™€ ๋‹ฌ๋ฆฌ NULL ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•œ ํ…Œ์ด๋ธ”์— ์—ฌ๋Ÿฌ ๊ฐœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ)

2. ํ…Œ์ด๋ธ” ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ (DDL)

-- 1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ (CREATE)
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY, -- PK ์„ค์ •
    email VARCHAR(255) NOT NULL UNIQUE,    -- Unique ์„ค์ •
    name VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
 
CREATE TABLE orders (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT,                        -- FK๋กœ ์‚ฌ์šฉํ•  ์ปฌ๋Ÿผ
    order_date DATE,
    -- FK ์ œ์•ฝ ์กฐ๊ฑด ์ถ”๊ฐ€: orders์˜ user_id๋Š” users์˜ id๋ฅผ ์ฐธ์กฐํ•œ๋‹ค
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
 
-- 2. ํ…Œ์ด๋ธ” ์ˆ˜์ • (ALTER)
ALTER TABLE users ADD COLUMN phone VARCHAR(20); -- ์ปฌ๋Ÿผ ์ถ”๊ฐ€
ALTER TABLE users MODIFY COLUMN name VARCHAR(200); -- ์ปฌ๋Ÿผ ์ˆ˜์ •
 
-- 3. ํ…Œ์ด๋ธ” ์‚ญ์ œ (DROP)
DROP TABLE orders; -- ํ…Œ์ด๋ธ” ํ†ต์งธ๋กœ ์‚ญ์ œ

3. ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„ (Relationships) ์ƒ์„ธ ๋ถ„์„

ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๊ตฌ์กฐ๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋…น์—ฌ๋‚ด๋Š” 3๊ฐ€์ง€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

โ‘  1:N ๊ด€๊ณ„ (์ผ๋Œ€๋‹ค, One-to-Many) - ๊ฐ€์žฅ ๋ณดํŽธ์ 

ํ•œ ์ชฝ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋‹ค๋ฅธ ์ชฝ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ: ๋ถ€์„œ(1) : ์ง์›(N), ๊ฒŒ์‹œ๊ธ€(1) : ๋Œ“๊ธ€(N), ๊ณ ๊ฐ(1) : ์ฃผ๋ฌธ(N)
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•: 'N' ์ชฝ ํ…Œ์ด๋ธ”์— '1' ์ชฝ์˜ PK๋ฅผ FK(์™ธ๋ž˜ํ‚ค)๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • ์ƒ๊ฐํ•ด๋ณด๊ธฐ: ์ง์› ํ…Œ์ด๋ธ”์— '๋ถ€์„œ ID'๊ฐ€ ์ ํ˜€ ์žˆ์–ด์•ผ, ์ด ์ง์›์ด ์–ด๋А ๋ถ€์„œ ์†Œ์†์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘ก 1:1 ๊ด€๊ณ„ (์ผ๋Œ€์ผ, One-to-One)

๋‘ ํ…Œ์ด๋ธ”์˜ ํ–‰์ด ์„œ๋กœ ์ •ํ™•ํžˆ ํ•˜๋‚˜์”ฉ๋งŒ ๋Œ€์‘๋˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ: ์‚ฌ์šฉ์ž(1) : ์‚ฌ์šฉ์ž ์ƒ์„ธ ํ”„๋กœํ•„(1), ๊ตญ๊ฐ€(1) : ์ˆ˜๋„(1)
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•: ์–ด๋А ํ•œ ์ชฝ ํ…Œ์ด๋ธ”์— ์ƒ๋Œ€๋ฐฉ์˜ PK๋ฅผ FK๋กœ ๋„ฃ์Šต๋‹ˆ๋‹ค. (์ด๋•Œ ํ•ด๋‹น FK๋Š” UNIQUE ์ œ์•ฝ์กฐ๊ฑด์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.)
  • ์‚ฌ์šฉ ์ด์œ : ๋ณด์•ˆ์ƒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ฑฐ๋‚˜, ํ…Œ์ด๋ธ”์ด ๋„ˆ๋ฌด ์ปค์ ธ์„œ ์„ฑ๋Šฅ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ชผ๊ฐœ์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ‘ข N:M ๊ด€๊ณ„ (๋‹ค๋Œ€๋‹ค, Many-to-Many)

์–‘์ชฝ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์„œ๋กœ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ์‹œ: ํ•™์ƒ(N) : ๊ฐ•์˜(M), ํฌ์ŠคํŠธ(N) : ํƒœ๊ทธ(M)
  • ์ค‘์š”: RDBMS์—์„œ๋Š” ๋‘ ํ…Œ์ด๋ธ”๋งŒ์œผ๋กœ๋Š” N:M์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ **'์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”(Mapping/Junction Table)'**์ด ์ค‘๊ฐ„์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•: ํ•™์ƒ๊ณผ ๊ฐ•์˜ ์‚ฌ์ด์— ์ˆ˜๊ฐ•์‹ ์ฒญ์ด๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , ์—ฌ๊ธฐ์— ํ•™์ƒ_ID์™€ ๊ฐ•์˜_ID๋ฅผ ๊ฐ๊ฐ FK๋กœ ๋‹ด์Šต๋‹ˆ๋‹ค.
    • ๊ฒฐ๊ณผ: ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด ํ•™์ƒ : ์ˆ˜๊ฐ•์‹ ์ฒญ์€ 1:N, ๊ฐ•์˜ : ์ˆ˜๊ฐ•์‹ ์ฒญ๋„ 1:N ๊ด€๊ณ„๊ฐ€ ๋˜์–ด ๋‹ค๋Œ€๋‹ค๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

4. ๊ด€๊ณ„ ์„ค์ •์˜ ํ•ต์‹ฌ: ์™ธ๋ž˜ํ‚ค ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ (Cascading)

๋ถ€๋ชจ ๋ฐ์ดํ„ฐ(1)๊ฐ€ ์ˆ˜์ •๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋  ๋•Œ, ์—ฐ๊ฒฐ๋œ ์ž์‹ ๋ฐ์ดํ„ฐ(N)๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

  • ON DELETE CASCADE: ๋ถ€๋ชจ๋ฅผ ์ง€์šฐ๋ฉด ์ž์‹๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. (์˜ˆ: ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ์‹œ ๋Œ“๊ธ€๋„ ์‚ญ์ œ)
  • ON DELETE SET NULL: ๋ถ€๋ชจ๋ฅผ ์ง€์šฐ๋ฉด ์ž์‹์˜ FK ๊ฐ’์„ NULL๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: ๋ถ€์„œ ์‚ญ์ œ ์‹œ ์ง์›์€ ๋‚จ๊ฒจ๋‘๊ณ  ๋ถ€์„œ ์ •๋ณด๋งŒ ๋น„์›€)
  • ON DELETE RESTRICT: ์ž์‹์ด ๋‚จ์•„์žˆ์œผ๋ฉด ๋ถ€๋ชจ๋ฅผ ์ง€์šธ ์ˆ˜ ์—†๊ฒŒ ๋ง‰์Šต๋‹ˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’, ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ์šฉ)

5. ์šฉ์–ด ์ •๋ฆฌ Q&A

  • Q: PK๋Š” ๊ผญ ์ˆซ์ž๋กœ ํ•ด์•ผ ํ•˜๋‚˜์š”?
    • A: ์ฃผ๋กœ AUTO_INCREMENT ์ˆซ์ž๋ฅผ ์“ฐ์ง€๋งŒ, UUID ๊ฐ™์€ ๊ณ ์œ  ๋ฌธ์ž์—ด์„ ์“ฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ธ๋ฑ์Šค ์„ฑ๋Šฅ์ƒ ์ˆซ์ž๊ฐ€ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Q: FK๊ฐ€ ์—†์–ด๋„ JOIN์€ ๋˜๋Š”๋ฐ ์™œ FK๋ฅผ ์“ฐ๋‚˜์š”?
    • A: FK๋Š” '๋ฐ์ดํ„ฐ์˜ ์•ˆ์ „๋ง'์ž…๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ๋ถ€๋ชจ ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, ์ฃผ๋ฌธ ๋‚ด์—ญ์ด ์žˆ๋Š”๋ฐ ์‚ฌ์šฉ์ž๋ฅผ ์ง€์›Œ๋ฒ„๋ฆฌ๋Š” ๋ถˆ์ƒ์‚ฌ๋ฅผ ๋ง‰์•„์ค๋‹ˆ๋‹ค.
  • Q: INDEX์™€ UNIQUE์˜ ์ฐจ์ด๋Š”?
    • A: UNIQUE๋Š” ์ค‘๋ณต ๋ฐฉ์ง€๊ฐ€ ๋ชฉ์ ์ด๊ณ , INDEX๋Š” ์กฐํšŒ ์†๋„ ํ–ฅ์ƒ์ด ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. (๋ณดํ†ต UNIQUE ์„ค์ • ์‹œ ์ž๋™์œผ๋กœ INDEX๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.)

๊ฒฐ๋ก 

์ข‹์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋Š” ๋‚˜์ค‘์— ์ฟผ๋ฆฌ๋ฅผ ์งœ๋Š” ์ˆ˜๊ณ ๋ฅผ ์ ˆ๋ฐ˜ ์ดํ•˜๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. PK๋กœ ์‹๋ณ„ํ•˜๊ณ , FK๋กœ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ๊ด€๊ณ„์— ๋งž๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์„ธ์š”!